home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / lang / sofa.lha / sofa / smalleiffel / lib_std / arrayed_collection.e < prev    next >
Text File  |  2000-03-25  |  3KB  |  124 lines

  1. -- This file is  free  software, which  comes  along  with  SmallEiffel. This
  2. -- software  is  distributed  in the hope that it will be useful, but WITHOUT 
  3. -- ANY  WARRANTY;  without  even  the  implied warranty of MERCHANTABILITY or
  4. -- FITNESS  FOR A PARTICULAR PURPOSE. You can modify it as you want, provided
  5. -- this header is kept unaltered, and a notification of the changes is added.
  6. -- You  are  allowed  to  redistribute  it and sell it, alone or as a part of 
  7. -- another product.
  8. --          Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
  9. --            Dominique COLNET and Suzanne COLLIN - colnet@loria.fr 
  10. --                       http://SmallEiffel.loria.fr
  11. --
  12. deferred class ARRAYED_COLLECTION[E]
  13.    -- 
  14.    -- Common root for ARRAY[E] and FIXED_ARRAY[E].
  15.    --
  16.  
  17. inherit COLLECTION[E];
  18.  
  19. feature {ARRAYED_COLLECTION}
  20.    
  21.    storage: NATIVE_ARRAY[E];
  22.          -- Internal access to storage location.
  23.    
  24. feature
  25.    
  26.    capacity: INTEGER;
  27.          -- Internal storage capacity in number of item.
  28.    
  29.    upper: INTEGER;
  30.          -- Upper index bound.
  31.    
  32. feature 
  33.  
  34.    frozen sub_array(low, up: INTEGER): like Current is
  35.       obsolete "The new name of this feature is `subarray'."
  36.       do
  37.      Result := subarray(low,up);
  38.       end;
  39.  
  40.    subarray(min, max: INTEGER): like Current is
  41.      -- New collection consisting of items at indexes in [`min' .. `max'].
  42.          -- Result has the same dynamic type as `Current'.
  43.      -- See also `slice'.
  44.       require
  45.          lower <= min;
  46.          max <= upper;
  47.          min <= max + 1
  48.       deferred
  49.       ensure
  50.          same_type(Result);
  51.          Result.count = (max - min + 1);
  52.          Result.lower = min or Result.lower = 0
  53.       end;
  54.  
  55. feature -- Implementation of deferred :
  56.  
  57.    first: like item is
  58.       do
  59.          Result := storage.item(0);
  60.       end;
  61.  
  62.    last: like item is
  63.       do
  64.          Result := item(upper);
  65.       end;
  66.  
  67.    add(element: like item; index: INTEGER) is
  68.       do
  69.          if index = upper + 1 then
  70.             add_last(element);
  71.          else
  72.             add_last(element);
  73.             move(index,upper - 1,1);
  74.             put(element,index);
  75.          end;
  76.       end;
  77.  
  78.    remove_last is
  79.       do
  80.          upper := upper - 1;
  81.       end;
  82.    
  83.    replace_all(old_value, new_value: like item) is
  84.       do
  85.          storage.replace_all(old_value,new_value,count - 1);
  86.       end;
  87.    
  88.    fast_replace_all(old_value, new_value: like item) is
  89.       do
  90.          storage.fast_replace_all(old_value,new_value,count - 1);
  91.       end;
  92.  
  93. feature -- Interfacing with C :
  94.    
  95.    to_external: POINTER is
  96.          -- Gives C access into the internal `storage' of the ARRAY.
  97.          -- Result is pointing the element at index `lower'.
  98.          -- 
  99.          -- NOTE: do not free/realloc the Result. Resizing of the array 
  100.          --       can makes this pointer invalid. 
  101.       require
  102.          not is_empty
  103.       do
  104.          Result := storage.to_pointer;
  105.       ensure
  106.          Result.is_not_null
  107.       end;
  108.  
  109. feature {ARRAYED_COLLECTION}
  110.  
  111.    set_upper(new_upper: like upper) is
  112.       do
  113.          upper := new_upper;
  114.       end;
  115.  
  116. invariant
  117.  
  118.    capacity >= (upper - lower + 1);
  119.  
  120.    capacity > 0 implies storage.is_not_null;
  121.  
  122. end -- ARRAYED_COLLECTION[E]
  123.  
  124.